package com.chao.stucture.stack;

import com.chao.stucture.list.SingLinkedListWithDummyHead;

import java.io.Serializable;

/**
 * @author : Rookie
 * @description : 栈 用链表实现
 * @date : 2022/11/25
 */
public class LinkedStack<E> {

    /**
     * 栈大小
     */
    private int size;
    /**
     * 头节点
     */
    private Node<E> head;

    static class Node<E> implements Serializable {
        /**
         * 元素
         */
        private E element;
        /**
         * 下一节点
         */
        private Node<E> next;

        public Node(E e) {
            this.element = e;
            this.next = null;
        }
    }

    public LinkedStack() {
        this.head = null;
        this.size = 0;
    }

    public Boolean isEmpty() {
        return this.size == 0;
    }

    public int size() {
        return this.size;
    }

    /**
     * 入栈一个元素
     * @param element
     */
    public void push(E element) {
        //创建节点
        Node<E> newNode = new Node<>(element);
        // 使用头插法插入节点
        newNode.next = this.head;
        this.head = newNode;
        this.size ++;
    }

    /**
     * 出栈一个元素
     */
    public E pop() {
        if (isEmpty()) {
            return null;
        } else {
            E element = this.head.element;
            this.head = this.head.next;
            this.size --;
            return element;
        }
    }

    /**
     * 获取栈顶元素
     * @return
     */
    public E top() {
        return this.head.element;
    }

    /**
     * 打印栈中的元素 从栈顶往栈底打印
     */
    public void print() {
        StringBuffer sb = new StringBuffer();
        Node<E> currNode = this.head;
        while (currNode != null) {
            sb.append(currNode.element);
            if (currNode.next != null) {
                sb.append(",");
            }
            currNode = currNode.next;
        }
        System.out.println(sb);
    }

    public static void main(String[] args) {
        LinkedStack<String> linkedStack = new LinkedStack<>();
        linkedStack.push("A");
        linkedStack.push("B");
        linkedStack.push("C");
        //打印栈内元素 从栈顶到栈底
        linkedStack.print();
        //打印栈顶元素
        System.out.println(linkedStack.top());
        //出栈一个元素
        String e1 = linkedStack.pop();
        System.out.println("栈是否为空：" + linkedStack.isEmpty());
        System.out.println("栈的大小为：" + linkedStack.size());
        System.out.println("栈顶元素为：" + linkedStack.top());
    }
}
